package service

import (
	"errors"
	"log"

	"im/args"
	"im/model"
	"im/utils"
	"strconv"
	"time"
)

type ContactService struct {

}

func (s *ContactService)AddFriend(args args.ContactArgs) error {
	if args.UserID == args.DstID {
		return errors.New("不能添加自己为好友！")
	}
	var contacter model.Contact
	var dstobj model.Contact
	utils.DB.Where("ownerid = ? and dstobj = ? and cate=?", args.UserID, args.DstID, model.CONCAT_CAT_USER).First(&contacter)
	if contacter.ID > 0 {
		return errors.New("已经添加过好友，请勿重复添加")
	}
	// 从这开始开启事务，将好友信息加入到数据库中
	// 注意要加两条信息
	tx := utils.DB.Begin()
	currentTime := time.Now()
	contacter.Ownerid = args.UserID
	contacter.Dstobj = args.DstID
	contacter.Createat = currentTime
	contacter.Cate = model.CONCAT_CAT_USER
	res := tx.Create(&contacter)
	if res.Error != nil {
		tx.Rollback()
		return errors.New("添加者写入数据库出错！")
	}
	dstobj.Ownerid = args.DstID
	dstobj.Dstobj = args.UserID
	dstobj.Createat = currentTime
	dstobj.Cate = model.CONCAT_CAT_USER
	res = tx.Create(&dstobj)
	if res.Error != nil {
		tx.Rollback()
		return errors.New("被添加者写入数据出错")
	}
	tx.Commit()
	log.Println("添加好友数据写入完成！")
	return nil
}

// 返回好友的id号 和 错误
// 我不知道要单建一个表，还是就是在model.User哪个表里直接查询
// 先再model.User 那个表里查询吧，如果有问题以后再改。
func (s *ContactService)GetFriendIds(userid string) ([]string, error) {
	//log.Println("开始查询数据库contact表。。。")
	var finders []model.Contact
	res := utils.DB.Where("ownerid = ? and cate = ?", userid, model.CONCAT_CAT_USER).Find(&finders)
	if res.Error!= nil {
		return nil, errors.New("查询数据库出错！")
	}
	//log.Println("checked database and the check is success...")
	//log.Println(finders)
	var friendIds []string
	for _, finder := range finders {
		//log.Println(finder)
		//log.Println(strconv.FormatInt(finder.Dstobj,10))
		friendIds = append(friendIds, strconv.FormatInt(finder.Dstobj,10))
		//log.Println(friendIds)
	}
	//log.Printf("friendids:%v\n", friendIds)
	return friendIds, nil

}

// 根据给的朋友id返回信息 
// 思考：如果我有200个好友，至少搜索200次数据库，所以我为什么不维护一个好友信息表呢？
// 表中只有本人基本可以公布的信息和好友的信息切片，第二版再改
func (s *ContactService)GetFriendInfo(friendid string)(args.FriendListInfo,error){
	var friendInfoStruct args.FriendListInfo
	var friendinfo model.User
	res := utils.DB.Where("id = ?", friendid).First(&friendinfo)
	if res.Error != nil {
		return friendInfoStruct, res.Error
	}
	// friendInfoStruct.Friendid = fmt.Sprintf("%d",friendinfo.ID)
	friendInfoStruct.Friendid = strconv.FormatUint(uint64(friendinfo.ID),10)
	friendInfoStruct.Friendavatar = friendinfo.Avatar
	friendInfoStruct.Friendname = friendinfo.NickName
	log.Println(friendInfoStruct)

	return friendInfoStruct, nil
}